/*
Problem Description
开学了，杭电又迎来了好多新生。ACMer想为新生准备一个节目。来报名要表演节目的人很多，多达N个，
但是只需要从这N个人中选M个就够了，一共有多少种选择方法？
 

Input
数据的第一行包括一个正整数T，接下来有T组数据，每组数据占一行。
每组数据包含两个整数N（来报名的人数,1<=N<=30），M（节目需要的人数0<=M<=30）
 

Output
每组数据输出一个整数，每个输出占一行
 

Sample Input
5
3 2
5 3
4 4
3 6
8 0
 

Sample Output
3
10
1
0
1
 */
package com.yuan.algorithms.base01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
 * @author YouYuan
 * @eMail E-mail:1265161633@qq.com
 * @Time 创建时间：2015年8月7日 下午2:23:12
 * @Explain 说明:N选M的问题。必须使用double类型存储变量，否则会超出存储限制
 */
public class 排列组合_新生晚会 {

	static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	
	static int nextInt() throws IOException {
		in.nextToken();
		return (int)in.nval;
	}
	
	public static void main(String[] args) throws IOException {
		int t = nextInt();
		while(--t>=0) {
			int n = nextInt();
			int m = nextInt();
			out.printf("%.0f", Cnm(n, m));
			out.println();
			out.flush();
		}
	}

	private static double Cnm(int n, int m) {
		double t = 1;
		for (int i = 1; i <= n; ++i) {
			t *= i;
		}
		double cm = 1;
		for (int i = 1; i <= m; i++) {
			cm *= i;
		}
		double k = 1;
		for (int i = 1; i <= n - m; i++) {
			k *= i;
		}
		return (t/cm/k);
	}

}
